// https://www.programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
// https://leetcode.cn/problems/squares-of-a-sorted-array/description/


// 最优解如下
// 双指针法 原数组两端指针向中间移动 最大的那个放在新数组的结尾

// 数组其实是有序的， 只不过负数平方之后可能成为最大数了。

// 那么数组平方的最大值就在数组的两端，不是最左边就是最右边，不可能是中间。

// 此时可以考虑双指针法了，i指向起始位置，j指向终止位置。

// 定义一个新数组result，和A数组一样的大小，让k指向result数组终止位置。

// 如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j]; 。

// 如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i]; 。
const sortedSquares = function (nums) {
  if (!Array.isArray(nums)) return;
  const length = nums.length;
  const newArr = new Array(length).fill(0);
  let slow = 0,
    fast = length - 1,
    resPoint = length - 1;
  while (slow <= fast) {
    const left = Math.pow(nums[slow], 2);
    const right = Math.pow(nums[fast], 2);
    if (left >= right) {
      newArr[resPoint] = left;
      slow++;
      resPoint--;
    } else {
      newArr[resPoint] = right;
      fast--;
      resPoint--;
    }
  }
  return newArr;
};

const nums = [-7, -3, 2, 3, 11];
// 输出：[4,9,9,49,121]
console.log(sortedSquares(nums));
